// modbusslave.h
#ifndef MODBUSSLAVE_H
#define MODBUSSLAVE_H

#include <QObject>
#include <QMap>
#include <QVariant>
#include <QString>
// 包含必要的 Qt Modbus 头文件
#include <QModbusServer>
#include <QModbusTcpServer>
#include <QModbusRtuSerialSlave>
#include <QModbusDevice>
#include <QModbusDataUnit>

class modbusSlave : public QObject
{
    Q_OBJECT

public:
    enum ModbusType
    {
        RTU,
        TCP
    };
    Q_ENUM(ModbusType)

    explicit modbusSlave(ModbusType type, int maxRegisterAddress = 100, QObject *parent = nullptr);
    ~modbusSlave();

    // 设置从机地址和端口参数
    void setRTUConnectionParameters(const QString &portName, int baudRate = 9600,
                                    const QString &parity = "None", int dataBits = 8,
                                    int stopBits = 1);                 // RTU参数
    void setTCPConnectionParameters(const QString &address, int port); // TCP参数

    // 设置从机地址
    void setSlaveId(int slaveId);

    // 启动和停止服务
    bool start();
    void stop();

    // 设置数据映射表
    void setDataMap(const QMap<int, QVariant> &dataMap);

    // 获取当前数据映射表
    QMap<int, QVariant> getDataMap() const;

    // 调试方法
    void printServerInfo() const;
    bool testRegisterAccess(int address) const;

public slots:
    // 更新数据映射表中的特定值
    // void updateData(int address, const QVariant &value);
    // 批量更新数据
    // void updateDataBatch(const QMap<int, QVariant> &updates);

signals:
    // 数据发生变化时发出信号
    void dataChanged(int address, const QVariant &value);
    // 批量数据变化信号
    void dataBatchChanged(const QMap<int, QVariant> &updates);
    // 错误信号
    void errorOccurred(const QString &errorString);

private slots:
    // 修复信号和槽参数匹配问题
    void handleDataWritten(QModbusDataUnit::RegisterType table, int address, int size);
    void handleErrorOccurred(QModbusDevice::Error error);
    void handleStateChanged(QModbusDevice::State state);

private:
    ModbusType m_type;
    QModbusServer *m_modbusServer;
    QMap<int, QVariant> m_dataMap;
    int m_slaveId;    // 从机地址
    int m_maxAddress; // 最大寄存器地址

    // 连接参数
    QString m_portName;
    int m_baudRate;
    QString m_parity;
    int m_dataBits;
    int m_stopBits;
    QString m_address;
    int m_port;

    void setupConnections();
};

#endif // MODBUSSLAVE_H